package com.beantools.execption;

import com.beantools.util.jsonutil.JSONImportUtil;

import static com.beantools.constants.SingleChar.*;
import static com.beantools.util.ObjectUtil.isNotNull;

/**
 * 这是<code>JsonException</code>类。主要是调用者在调用类<code>{@link JSONImportUtil}
 * </code>，由于误操作导致的异常信息，需要向外抛出异常信息。
 *
 * @author baoya
 * @version 1.0
 * @since 1.1.0
 */
public class JSONException extends RuntimeException {

    /**
     * 表示特定的类字面常量，如果调用者传递该类，获取该类的类路径，
     * 用于指明是哪个类出现了错误
     */
    private Class<?> persistentClazz;

    /**
     * 抛出的异常信息，比如属性名nAme的第二字母不能大写
     */
    private String message;

    /**
     * 实例化异常的构造器，其有两个参数，{@code message}需要抛出具体的异常信息;
     *
     * @param message 抛出的异常信息
     * @since 1.1.0
     */
    public JSONException(String message) {
        super(message);
        this.message = message;
    }

    /**
     * 实例化异常的构造器，其有两个参数，{@code message}需要抛出具体的异常信息;
     * {@code persistentClazz}是当前类字面常量
     *
     * @param message         抛出的异常信息
     * @param persistentClazz 调用者传递的类字面常量
     * @since 1.1.0
     */
    public JSONException(String message, Class<?> persistentClazz) {
        super(message);
        this.message = message;
        this.persistentClazz = persistentClazz;

    }

    /**
     * 重写父类的方getMessage()法，返回自定义的错误信息。首先，属性名不能为空
     * 否则，就抛出空指针异常。如果当前类的类字面常量不为空，则抛出了异常，比如：
     *
     * @return message 错误信息
     */
    @Override
    public String getMessage() {
        return (isNotNull(persistentClazz) ? ("类" + persistentClazz.getName() + "的") : NULL_OP)
                + "异常信息 " + SIGN_COLON_OP + BLANK_OP + this.message;
    }
}
